from html import unescape
import re
import requests
from urllib.parse import quote
import threading
from concurrent.futures import ThreadPoolExecutor
class JdSearch:
    def __init__(self, query_string):
        self.url = "https://icredit.jd.com/search/common/entList"  # 初始化请求的URL
        self.headers = {
            "Accept": "*/*",  # 接受的响应类型
            "Accept-Encoding": "gzip, deflate, br",  # 接受的编码方式
            "Accept-Language": "zh-CN,zh;q=0.9",  # 接受的语言
            "Connection": "keep-alive",  # 连接状态
            "Content-Length": "80",  # 内容长度
            "Content-Type": "application/json; charset=utf-8",  # 内容类型
            "Cookie": "",  # Cookie信息
            "Host": "icredit.jd.com",  # 主机名
            "Node-Referrer": "https://icredit.jd.com",  # 节点引用
            "Origin": "https://icredit.jd.com",  # 源地址
            "Referer": "https://icredit.jd.com/searchResult/enterprise?name="+quote(query_string),  # 引用地址
            "Sec-Fetch-Dest": "empty",  # 安全抓取目标
            "Sec-Fetch-Mode": "cors",  # 安全抓取模式
            "Sec-Fetch-Site": "same-origin",  # 安全抓取站点
            "Sgm-Context": "612101414084411600;612101414084411600",  # SGM上下文
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",  # 用户代理
            "X-Requested-With": "XMLHttpRequest",  # 请求类型
            "sec-ch-ua": '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',  # 浏览器标识
            "sec-ch-ua-mobile": "?0",  # 移动设备标识
            "sec-ch-ua-platform": "Windows"  # 平台标识
        }
        self.data = {
            "pageSize": 10,  # 每页显示的数据条数
            "pageNum": 1,  # 当前页码
            "queryString": query_string  # 查询字符串
        }

    def get_data(self):
            response = requests.post(self.url, json=self.data, headers=self.headers)
            datas = response.json()["data"]["list"]
            return datas

    def display_info(self, datas):
        if datas[0]["regStatus"] in "存续":
            print("企业名称：", datas[0]["entName"])
            print("实际掌控人：", datas[0]["legalPersonName"])
            print("服务类型：", datas[0]["majCategory"])
            print("注册资本：", datas[0]["regCapital"])
            print("电话：", datas[0]["phoneNumber"])
            print("地区：", datas[0]["province"])
            text = datas[0]["companyAddress"]
            print("公司地址：", re.sub('<[^>]*>', '', unescape(text)))
            print("\n")
        else:
            print("关联查找开始", "\n", "关联公司：", datas[0]["entName"], datas[0]["legalPersonName"])
            datasi = {
                "cid": datas[0]["legalPersonNameUuid"],
                "pageSize": 10,
                "pageNum": 1,
                "role": "1"
            }
            dataI = requests.post(url='https://icredit.jd.com/personal/data/queryentlist', json=datasi, headers=self.headers).json()
            for i in dataI["data"]["rows"]:
                if i["regStatus"] in "存续（在营、开业、在册）":
                    print("企业名称：", i["entName"])
                    for j in JdSearch(i["entName"]).get_data():
                        if j["legalPersonNameUuid"] in datas[0]["legalPersonNameUuid"]:
                            print("服务类型：", j["majCategory"])
                            print("注册资本：", j["regCapital"])
                            print("公司地址：", j["companyAddress"])
                            print("电话：", j["phoneNumber"])
                            print("地区：", j["province"])
                            text = j["companyAddress"]
                            print("公司地址：", re.sub('<[^>]*>', '', unescape(text)))
                            print("\n")
def run(datalist):# 启动函数
    with ThreadPoolExecutor(max_workers=2) as executor:
            for query_string in datalist:
                executor.submit(JdSearch(query_string).display_info(JdSearch(query_string).get_data()))

if __name__ == "__main__":
    datalist = ["湖北阿姨家政有限公司","北京北大青鸟发展投资有限公司","北大青鸟文教投资集团有限公司","腾讯医疗健康（深圳）有限公司"]  # 查询的公司字符串列表
    run(datalist)
# 可以使用判断列表个数选择是否使用多个线程
# 没有关闭线程因为就只有一个线程
# 接口每一个key参数名
'''
"companyId"：公司的唯一标识符。
"entName"：公司的全称。
"entNameHigh"：公司全称的高亮版本，其中重要的部分会以红色显示。
"usedEntName"：公司曾使用过的全称。
"legalPersonName"：公司的法定代表人姓名。
"legalPersonNameHigh"：公司法定代表人姓名的高亮版本，其中重要的部分会以红色显示。
"totalScore"：公司的总体评分。
"logo"：公司的Logo图片链接。
"phoneNumber"：公司的联系电话。
"morePhoneNumber"：是否有更多的联系电话。
"regCapital"：公司的注册资本。
"estiblishTime"：公司的成立时间。
"entEmail"：公司的电子邮箱地址。
"entEmailList"：公司电子邮箱列表。
"entWebsite"：公司的官方网站地址。
"product"：公司的主要产品或服务。
"stockCode"：公司的股票代码。
"companyAddress"：公司的注册地址。
"regStatus"：公司的注册状态，如“存续”表示公司仍在运营。
"province"：公司所在的省份。
"labels"：公司的标签，包括类型和描述信息。
"matchType"：公司名称匹配的类型和匹配度，以及高亮显示的内容。
"legalPersonNameUuid"：法定代表人的UUID。
"profile"：法定代表人的简介信息。
"businessScope"：公司的经营范围。
"trademark"：公司的商标信息。
"shareName"：公司的股东名称。
"senior"：公司的高管人员名单。
"regNo"：公司的注册号。
"creditCode"：公司的信用代码。
"orgNo"：公司的组织机构代码。
"wechatTitle"：微信公众号的标题。
"webName"：公司的网站名称。
"patent"：公司的专利信息。
"stockSimple"：公司的股票简称。
"corpTagType"：公司的标签类型。
"investorCid"：投资者的ID。
"majCategory"：公司的主要行业分类
'''